latexdiff トラブルシューティング
from latexdiff-vcでGit差分に基づく変更箇所を示した原稿PDFを出力
よくあるエラーパターン
1. Paragraph ended before \@sect was complete
latexdiff が生成した DIF マーキングが、\section や \subsection 等のセクションコマンドの引数内に入り込み、段落終了(空行)などによって分断されることが原因。
主な発生条件
改ページコマンド(\newpage ↔ \clearpage)の変更
セクション構造の大幅な変更(セクションの追加・移動など)
コメントアウトされた行の追加・削除
2. Too many }'s
上記と同様に DIF マーキングの整合性が崩れ、波括弧の対応が取れなくなることが原因。
対処法
以下のようなパターンをコンパイルスクリプトやエラーチェックスクリプトに追加しておくことで、典型的な問題を自動修正できる。
パターン1: 空行を含む %DIFDELCMD コメントブロックの除去
元のファイルで空行があった箇所に、latexdiff が空行を含む削除コメントブロックを生成した場合に削除する。
code: (perl)
s/%DIFDELCMD < \n\n%DIFDELCMD < %%%\n//g
パターン2: \newpage → \clearpage の変更マーキングの正規化
改ページコマンドの変更に伴う複雑な DIF マーキングを単純な置換にまとめる。
code: (perl)
s/\\DIFdelbegin %DIFDELCMD < \\newpage\n%DIFDELCMD < %%%\n\\DIFdelend \\DIFaddbegin \\clearpage\n\\DIFaddend /\\clearpage\n/g
パターン3: 削除された \newpage 単独パターンの除去
\newpage の削除に対して余計な DIF マーキングが付く場合に対応。
code: (perl)
s/\\DIFdelbegin %DIFDELCMD < \\newpage\n%DIFDELCMD < \n\n%DIFDELCMD < %%%\n\\DIFdelend //g
パターン4: 追加されたセクションコマンドの DIF マーキング修正
セクション引数内に \DIFaddbegin が入り込む場合の修正。
code: (perl)
s/\\DIFaddbegin \n\n\\subsection\{\\DIFaddend /\\subsection{/g
パターン5: セクションタイトルの大幅変更時の複雑な置換
セクションタイトルが大幅に変更され、DIF マーキングが複雑になった場合は、特定パターンを直接置換する。
(※実プロジェクトでは具体的なセクション名や変更内容に応じて適宜カスタマイズする)
code: (perl)
s/\\subsection\{.*?\\DIFdelbegin .*?\\DIFaddbegin .*?\\DIFaddend \}/\\subsection{...}/gs
新しいエラーが発生した場合の手順
1. エラー内容を確認
2. 差分ファイルを生成
code: (bash)
latexdiff-vc --git --flatten --force -t CFONT -r <commit_id> <対象ファイル>
3. エラー行付近を確認
code: (bash)
sed -n '<行番号-5>,<行番号+5>p' <差分ファイル名>
4. DIF マーキングの崩れを特定し、必要な perl 置換を作成
5. コンパイルスクリプトやエラーチェックスクリプトに追加して再発防止
予防策
セクション構造を大幅に変更する際は、差分 PDF が壊れやすいことを理解しておく
コメントアウトは差分として検出されるため、不要なコメントは事前に整理する
\newpage より \clearpage を使用すると、一部のマーキング崩れが起きにくくなる